home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
monitory
/
sysmon
/
src
/
startsm.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-11-20
|
8KB
|
284 lines
/*
** $RCSfile: StartSM.c,v $
** $Filename: StartSM.c $
** $Revision: 0.6 $
** $Date: 1995/11/04 14:11:26 $
**
** sysmon.library startup command StartSM (version 0.7)
**
** (C) Copyright 1995 by Etienne Vogt
*/
#include <exec/alerts.h>
#include <exec/memory.h>
#include <exec/execbase.h>
#include <dos/dos.h>
#include <dos/dostags.h>
#include <workbench/startup.h>
#define __USE_SYSBASE
#include <proto/exec.h>
#include <proto/dos.h>
#include "sysmon.h"
#include "sysmon_protos.h"
#include "sysmon_pragmas.h"
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
struct ExecBase *SysBase;
struct DosLibrary *DOSBase;
struct SysmonBase *SysmonBase;
static struct WBStartup *wbmsg;
static struct RDArgs *myrda;
static UBYTE version[] = "$VER: StartSM 0.7 (19.11.95)";
static UBYTE template[] = "CONF=CONFIGFILE";
static UBYTE configfile[] = "S:Sysmon.config";
static UBYTE syslogfile[] = "S:Sysmon.log";
static UBYTE syslogwindow[] = "CON:20/50/600/80/SysLog/AUTO/CLOSE/WAIT";
static ULONG filepri = LOG_DEBUG;
static ULONG windowpri = LOG_WARN;
static ULONG consolepri = LOG_EMERG;
static ULONG numbuffers = 5;
static ULONG stampperiod = 60; /* 1 hour default period */
static int idleled = FALSE;
static STRPTR logfile,logwindow;
#define OPT_CONFIG 0
#define OPTMAX 1
/* Definitions for config file parser */
#define P_IGNORE 0
#define P_STRING 1
#define P_BOOL 2
#define P_INT 3
#define OK 0
#define ERR_OPEN 1
#define ERR_UNKNPREF 2
#define ERR_NOMEM 3
static STRPTR errmsg[] = {
"OK",
"Unable to Open",
"Unknown Keyword",
"Out of memory",
};
typedef struct
{ STRPTR name; /* Configuration item name */
APTR pflag; /* Pointer to variable */
UWORD nbmin_char; /* Required characters in item name */
UWORD type; /* Parameter type */
} Pref;
Pref Prefs[] = {
{"LOGFILE", &logfile, 4, P_STRING},
{"LOGWINDOW", &logwindow, 4, P_STRING},
{"FILEPRI", &filepri, 5, P_INT},
{"WINPRI", &windowpri, 4, P_INT},
{"CONPRI", &consolepri, 4, P_INT},
{"LOGBUFFERS", &numbuffers, 4, P_INT},
{"STAMPPERIOD", &stampperiod, 6, P_INT},
{"IDLELED", &idleled, 4, P_BOOL},
{"#", NULL, 1, P_IGNORE},
{";", NULL, 1, P_IGNORE},
};
#define NB_PREFS (sizeof(Prefs)/sizeof(Pref))
ULONG __saveds main(void);
static void cleanexit(ULONG rc);
static void KPrintf(STRPTR fmt, ...);
static BOOL SysLog(ULONG priority, STRPTR format, ...);
static int ReadConfig(STRPTR file);
static char *strtokg(char *s1, char *s2);
static int InitPrefLine(char *line, Pref *pref_array, int nb_prefs);
ULONG __saveds main(void) /* No startup code */
{
struct Process *myproc;
LONG opts[OPTMAX];
int error;
SysBase = *(struct ExecBase **)4;
DOSBase = NULL;
SysmonBase = NULL;
wbmsg = NULL;
myrda = NULL;
myproc = (struct Process *)FindTask(NULL);
if ((DOSBase = (struct DosLibrary *)OpenLibrary("dos.library",36)) == NULL)
{ Alert(AT_Recovery|AG_OpenLib|AO_DOSLib);
return 100;
}
if (!(myproc->pr_CLI)) /* If started from WB, exit cleanly */
{ WaitPort(&(myproc->pr_MsgPort));
wbmsg = (struct WBStartup *)GetMsg(&(myproc->pr_MsgPort));
cleanexit(20);
}
else
{ if ((SysmonBase = (struct SysmonBase *)OpenLibrary("sysmon.library",0)) == NULL)
{ Printf("StartSM : Couldn't open sysmon.library\n");
cleanexit(20);
}
memset((char *)opts, 0, sizeof(opts));
if ((myrda = ReadArgs(template, opts, NULL)) == NULL)
{ PrintFault(IoErr(),NULL);
cleanexit(20);
}
if (opts[OPT_CONFIG] == 0) opts[OPT_CONFIG] = (LONG)configfile;
Forbid();
if (SysmonBase->sb_SyslogPort)
{ Permit();
Printf("StartSM : The %s process is already running.\n", SysmonBase->sb_ServerName);
cleanexit(10);
}
Permit();
if ((logfile = AllocVec(strlen(syslogfile)+1,MEMF_PUBLIC)) == NULL)
{ Printf("StartSM : No memory for File name buffer\n");
cleanexit(20);
}
strcpy(logfile, syslogfile);
if ((logwindow = AllocVec(strlen(syslogwindow)+1,MEMF_PUBLIC)) == NULL)
{ Printf("StartSM : No memory for Window name buffer\n");
FreeVec(logfile);
cleanexit(20);
}
strcpy(logwindow, syslogwindow);
if (error = ReadConfig((STRPTR)opts[OPT_CONFIG]))
{ Printf("StartSM : Error reading configuration file (%s).\n", errmsg[error]);
cleanexit(20);
}
if (idleled) SysmonBase->sb_Flags |= SBFF_IDLELED;
SysmonBase->sb_SyslogFile = logfile;
SysmonBase->sb_SyslogWindow = logwindow;
SysmonBase->sb_FilePri = filepri;
SysmonBase->sb_WindowPri = windowpri;
SysmonBase->sb_ConsolePri = consolepri;
SysmonBase->sb_NumLogBuffers = numbuffers;
SysmonBase->sb_StampPeriod = stampperiod * 60;
if (CreateNewProcTags(NP_Entry, SysmonBase->sb_ServerEntry,
NP_StackSize, 4000,
NP_Name, SysmonBase->sb_ServerName,
NP_Priority, 3,
NP_WindowPtr, -1,
TAG_DONE ) == NULL)
{ Printf("StartSM : Could not start %s process.\n", SysmonBase->sb_ServerName);
FreeVec(logfile);
FreeVec(logwindow);
cleanexit(20);
}
if ((error = SysmonBase->sb_LastGuru) != -1)
{ SysLog(LOG_WARN | LOG_NOWIN, "StartSM : System rebooted by Alert !\nGuru Meditation #%08lx.%08lx\n",
error, SysBase->LastAlert[1]);
}
smSleep(20);
}
cleanexit(0);
}
static void cleanexit(ULONG rc)
{
if (myrda) FreeArgs(myrda);
if (SysmonBase) CloseLibrary((struct Library *)SysmonBase);
if (DOSBase) CloseLibrary((struct Library *)DOSBase);
if (wbmsg)
{ Forbid();
ReplyMsg((struct Message *)wbmsg);
}
Exit(rc);
}
static void KPrintf(STRPTR fmt, ...)
{ smVKPrintf(fmt, &fmt + 1);
}
static BOOL SysLog(ULONG priority, STRPTR format, ...)
{ return smVSysLog(priority, format, &format + 1);
}
#define MAX_T_LINE 80
static int ReadConfig(STRPTR file)
{ char line[MAX_T_LINE+1];
BPTR f_in;
int error;
if ((f_in = Open(file, MODE_OLDFILE)) == NULL) return ERR_OPEN;
while (FGets(f_in, (STRPTR)line, MAX_T_LINE))
{ if (error = InitPrefLine(line, Prefs, NB_PREFS)) return error;
}
Close(f_in);
return OK;
}
static char *strtokg(char *s1, char *s2)
{ char *begin, *end;
static char *save = "";
begin = s1 ? s1 : save;
if (begin == NULL) return NULL;
begin += strspn(begin, s2);
if (*begin == '\0')
{ save = "";
return NULL;
}
else
{ if (*begin == '\"')
{ begin++;
end = strchr(begin, '\"');
}
else
end = strpbrk(begin, s2);
if (end && *end) *end++ = '\0';
}
save = end;
return begin;
}
static int InitPrefLine(char *line, Pref *pref_array, int nb_prefs)
{ char *p, *parm, **pflag;
char *seps = " =\t\r";
int i, l;
if (p = strchr(line, '\n')) *p = '\0';
if ((p = strtok(line, seps)) == NULL) return OK;
for (i=0; i < nb_prefs; i++)
{ l = strlen(p);
if (l < pref_array[i].nbmin_char) continue;
if (strnicmp(p, pref_array[i].name, l) == 0) break;
}
if (i == nb_prefs) return ERR_UNKNPREF;
if ((parm = strtok(NULL, seps)) == NULL) return OK; /* no value */
if (pref_array[i].type == P_IGNORE) return OK;
if (pref_array[i].type == P_BOOL)
{ *parm = toupper((int)*parm);
if (*parm == 'N' || *parm == 'F') *(int *)pref_array[i].pflag = 0;
if (*parm == 'Y' || *parm == 'O' || *parm == 'T') *(int *)pref_array[i].pflag = 1;
}
else if (pref_array[i].type == P_STRING)
{ pflag = (char **)pref_array[i].pflag;
if (*pflag) FreeVec(*pflag); /* Free default string buffer */
*pflag = AllocVec(strlen(parm)+1, MEMF_PUBLIC);
if (*pflag) strcpy(*pflag, parm);
else return ERR_NOMEM;
}
else if (pref_array[i].type == P_INT)
{ *(int *)pref_array[i].pflag = atoi(parm);
}
return OK;
}